﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcBlog.ViewModels;
using MvcBlog.Common.Models;
using MvcBlog.Common.Exceptions;

namespace MvcBlog.Controllers
{
    public class RegisterController : Controller
    {

        LoginDataAccess loginDB;

        public RegisterController()
        {
            var con = ConnectionFactory.getConnection();
            loginDB = new LoginDataAccess(con);
        }

        //
        // GET: /Activation/
        public ActionResult Activation(RegisterViewModel registerVm)
        {
            return View();
        }

        //
        // GET: /Register/Create

        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Register/Create

        [HttpPost]
        public ActionResult Create(RegisterViewModel registerVm)
        {
           if (ModelState.IsValid) {

                    //viewmodel zu model umbauen
                    User newUser = new User();
                    registerVm.ApplyChanges(newUser);

                    //User in DB speichern 
                    User addedUser = new User();
                    try
                    {
                        addedUser = loginDB.addNewUser(newUser);
                    }
                    catch (UserNotUniqueException)
                    {
                        //User existiert bereits
                        ModelState.AddModelError("Username", "Dieser Username existiert bereits!");
                        return View(registerVm);
                    }

                    if (addedUser != null)
                    {
                        RegisterViewModel newUserVm = new RegisterViewModel(addedUser);

                        //Erfolg - auf angelegte frage weiterleiten
                        return View("Activation", newUserVm);
                    }
                    else
                    {
                        return RedirectToAction("Error");
                    }

           }
           else
           {
               //User hat das Formular nicht richtig ausgefüllt
               return View();
           }
        }

        public ActionResult Activate(int user_id, string activationHash)
        {
            //eingaben validieren und user aktivieren
            String message = "";
            try
            {
                User user = loginDB.getUserByID(user_id);
                RegisterViewModel registerVm = new RegisterViewModel(user);
                if (user.Activated)
                {
                    //User ist bereits aktiviert
                    message = "Sie haben Ihren Account bereits aktiviert.";
                }
                else if (user.RegistrationHash.Equals(activationHash))
                {
                    //noch nicht aktiviert, Hash korrekt
                    if (!loginDB.activateUser(user_id, activationHash))
                        throw new Exception();
                    message = "Ihr Account wurde erfolgreich freigeschalten!";
                }
                else
                {
                    message = "Bitte überprüfen Sie nochmals die Freischalt-URL.";
                }

                ViewData["message"] = message;
                return View(registerVm);

            }
            catch (Exception)
            {
                return View("Error");
            }

            
        }

    }
}
